import json
import os
from langchain_deepseek import ChatDeepSeek
from langchain_text_splitters import RecursiveCharacterTextSplitter
import requests
from bs4 import BeautifulSoup
from datetime import datetime, timedelta
from langchain_community.document_loaders import BrowserbaseLoader,WebBaseLoader
from langchain_openai import ChatOpenAI, OpenAIEmbeddings  
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import OllamaEmbeddings
from langchain import hub,PromptTemplate
from langchain.chains import RetrievalQA
from outputParser import news_parser
apikey="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"
base_url="https://api.openai.com/v1"

class News:
    def __init__(self, title: str, date: str, source: str, content: str,today:str):
        self.title = title
        self.date = date
        self.source = source
        self.content = content
        self.today=today

def fetch_news(urls, pastdays):
    news_list = []

    for url in urls:
        response = requests.get(url)
        soup = BeautifulSoup(response.content, 'html.parser')
        news_items = soup.find_all(class_='news-item')
        for item in news_items:
            title = item.find(class_='news-content').find('h2').text if item.find(class_='news-content').find('h2') else 'No title found'
            date = item.find_parent(class_='news-list').find(class_='news-date').text if item.find_parent(class_='news-list').find(class_='news-date') else 'No date found'
            source = item.find(class_='news-content').find('h2').find('a')['href'] if item.find(class_='news-content').find('h2').find('a') else 'No source found'
            content = ' '.join([p.text for p in item.find(class_='news-content').find_all('p')])
            content=content.split('来源')[0]
            today = datetime.today()
            startDay = today - timedelta(days=pastdays)
            # 将日期格式化为 YYYY.MM.DD 格式
            formatted_date = today.strftime("%Y.%m.%d")
            formatted_startDay = startDay.strftime("%Y.%m.%d")
            news = News(title, date, source, content,f'{formatted_startDay}~{formatted_date}')
            if is_within_past_days(date, pastdays):
                news_list.append(news)
    return news_list
def is_within_past_days(date_str, pastdays):
    # 获取当前日期
    today = datetime.today()

     # 创建一个字典，将中文星期几转换为数字
    week_map = {
        '一': '1',
        '二': '2',
        '三': '3',
        '四': '4',
        '五': '5',
        '六': '6',
        '日': '0',
    }

    # 替换日期字符串中的中文星期几
    for cn_week, num_week in week_map.items():
        date_str = date_str.replace(f'周{cn_week}', f'周{num_week}')

    # 将日期字符串转换为日期对象
    date_obj = datetime.strptime(date_str, "%m月%d日·周%w")

    # 将日期对象的年份设置为当前年份
    date_obj = date_obj.replace(year=today.year)

    # 计算日期是否在过去 pastdays 天内
    past_date = today - timedelta(days=pastdays)
    return past_date <= date_obj <= today

if __name__ == "__main__":
    urls = [
        'https://ai-bot.cn/daily-ai-news/'
    ]
    news_list = fetch_news(urls,7)

    for news in news_list:
        print(f"Title: {news.title}")
        print(f"Date: {news.date}")
        print(f"Source: {news.source}")
        print(f"Content: {news.content}")
        print(f"Today: {news.today}")
        print("\n")
def get_BIM_news(query):
    # model = ChatOpenAI(
    #         model="gpt-4o-mini",
    #         temperature=0,
    #     )
    # model = ChatDeepSeek(
    #         model="deepseek-chat",
    #         temperature=0,
    #         max_tokens=None,
    #         timeout=None,
    #         max_retries=2,
    #         api_key="sk-c29b014fa48f4a95bca0b44455f55ea9",
    #         # other params...
    #     )
    class BIMNews():
        def __init__(self, title: str, date: str, source: str, content: str,link: str):
            self.title = title
            self.date = date
            self.source = source
            self.content = content
            self.link = link
        
    model = ChatOpenAI(
    model="qwen-plus-2025-04-28",
    api_key="sk-c11908b122d94662b3e16f2d958af3f0",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    temperature=0,
    )

    urls=[  
            "http://zjw.beijing.gov.cn/", 
            "http://zfcxjs.tj.gov.cn", 
            "http://zfcxjst.hebei.gov.cn", 
            "http://zjt.shanxi.gov.cn", 
            "http://zjt.nmg.gov.cn/", 
            "http://zjt.ln.gov.cn/", 
            "http://jst.jl.gov.cn/", 
            "http://zfcxjst.hlj.gov.cn", 
            "http://zjw.sh.gov.cn/", 
            "https://jsszfhcxjst.jiangsu.gov.cn/", 
            "http://jst.zj.gov.cn/", 
            "http://dohurd.ah.gov.cn/", 
            "http://zjt.fujian.gov.cn/", 
            "http://zjt.jiangxi.gov.cn/", 
            "http://zjt.shandong.gov.cn/", 
            "https://hnjs.henan.gov.cn/", 
            "http://zjt.hubei.gov.cn/", 
            "http://zjt.hunan.gov.cn/", 
            "http://zfcxjst.gd.gov.cn/", 
            "http://zjt.gxzf.gov.cn/", 
            "http://zjt.hainan.gov.cn", 
            "http://zfcxjw.cq.gov.cn/", 
            "http://jst.sc.gov.cn/", 
            "http://zfcxjst.guizhou.gov.cn/", 
            "http://zfcxjst.yn.gov.cn/", 
            "http://zjt.xizang.gov.cn/", 
            "http://js.shaanxi.gov.cn/", 
            "http://zjt.gansu.gov.cn/", 
            "http://zjt.qinghai.gov.cn/", 
            "http://jst.nx.gov.cn/", 
            "http://zjt.xinjiang.gov.cn/", 
            "http://jshbj.xjbt.gov.cn/"
    ]
    loader = WebBaseLoader(
    urls
    )

    docs=loader.load()
    newsList=[]
    extract_news = []
    for doc in docs:
        # print(doc.metadata)
        # print(doc.page_content)
        if doc.metadata and doc.page_content:
            newsList.append({'metadata':doc.metadata,'content':doc.page_content})
    # print(newsList)
    # 将 newsList 转换为 JSON 字符串
    for news in newsList:
        news_json=json.dumps(news, ensure_ascii=False, indent=4)
        query = f'''你是一名专业的BIM领域新闻编辑，负责从提供的新闻资料中精准提取以下关键领域的新闻信息：
            - BIM技术
            - 智能建造
            - 智慧城市
            - 智慧交通
            如果没有相关信息，请返回空列表，不要捏造虚假事实。

            【输出要求】
            请为每条新闻生成包含以下字段的结构化数据（json格式）：
            ### title: 
            （用20字内提炼核心内容，要求吸引眼球）

            ### date: 
            （格式统一为"YYYY年MM月DD日"，如2025年4月28日）

            ### content: 
            （60-100字摘要，需包含：
            1. 事件核心内容
            2. 技术应用亮点
            3. 行业影响价值）

            ### source: 
            （发布机构全称）

            ### link: 
            {news['metadata']['source']}（完整URL链接）

            【处理原则】
            1. 优先选择含具体技术指标、政策法规、重大项目的新闻
            2. 排除纯商业推广、无实质内容的消息
            3. 对专业术语需保持原貌不作简化
            4. 日期缺失时标注"未注明"，链接缺失时标注"无"

            【输入数据】
            以下是待处理的JSON格式新闻原始数据：
            {news_json}

            请确保输出内容专业、准确、简洁，符合行业媒体报道标准。'''
        response=model.invoke(query)
        print(response.content)
        extract_news.append(response.content)
        output_news=[]
    for news in extract_news:
        #提取markdown中的json
        json_start = news.find('```json')
        json_end = news.find('```', json_start + 3)
        if json_start != -1 and json_end != -1:
            json_str = news[json_start + 7:json_end]
            print (json_str)
            #将json字符串转换为python对象
            json_obj = json.loads(json_str)
            if isinstance(json_obj, list):
                if json_obj.__len__() > 0:
                    for item in json_obj:
                        output_news.append(BIMNews(item['title'], item['date'], item['source'], item['content'], item['link']))

                        
    return output_news


        # print(news['metadata'])
        # print(news['content'])
        
        # print(news['content'])
    
    # news_list_json = json.dumps(newsList, ensure_ascii=False, indent=4)
    # # 打印 JSON 字符串
    # print(news_list_json)
    # return news_list_json
    #将newsList对象转换成json字符串，包括正文、参考来p源等


    #将docs对象转换成字符串，包括正文、参考来源等
    # docs = [doc.page_content for doc in docs]


    
    # query = f'''你是一个BIM新闻记者，跟踪BIM、智能建造、智慧城市、智慧交通等跟建筑数字化相关的政策和新闻热点，
    # 根据提供的资料，提取对应的新闻信息，提取内容包含新闻标题、时间、正文内容、参考来源和链接
    # 返回json格式的列表，列表包括多个BIM、智能建造、智慧城市、智慧交通等跟建筑数字化相关的政策和新闻热点，每个新闻包含以下字段：
    # title:新闻标题
    # date:新闻日期如2025年4月28日
    # content:新闻正文内容
    # source:新闻来源
    # link:新闻链接
    # 内容要简洁明了，符合新闻报道的风格。    
    # 以下是提供的json格式的新闻资料:
    # {news_list_json}
    
    # '''
#     query = f'''你是一名专业的BIM领域新闻编辑，负责从提供的新闻资料中精准提取以下关键领域的新闻信息：
# - BIM技术
# - 智能建造
# - 智慧城市
# - 智慧交通
# 如果没有相关信息，请返回空列表，不要捏造虚假事实。

# 【输出要求】
# 请为每条新闻生成包含以下字段的结构化数据（Markdown格式）：
# ### title: 
# （用20字内提炼核心内容，要求吸引眼球）

# ### date: 
# （格式统一为"YYYY年MM月DD日"，如2025年4月28日）

# ### content: 
# （60-100字摘要，需包含：
# 1. 事件核心内容
# 2. 技术应用亮点
# 3. 行业影响价值）

# ### source: 
# （发布机构全称）

# ### link: 
# （完整URL链接）

# 【处理原则】
# 1. 优先选择含具体技术指标、政策法规、重大项目的新闻
# 2. 排除纯商业推广、无实质内容的消息
# 3. 对专业术语需保持原貌不作简化
# 4. 日期缺失时标注"未注明"，链接缺失时标注"无"

# 【输入数据】
# 以下是待处理的JSON格式新闻原始数据：
# {news_list_json}

# 请确保输出内容专业、准确、简洁，符合行业媒体报道标准。'''
    # response = news_parser(query)
    # model = ChatOpenAI(
    # model="qwen-plus-2025-04-28",
    # api_key="sk-c11908b122d94662b3e16f2d958af3f0",
    # base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    # temperature=0,
    # )
    # response=model.invoke(query)
    # return response.content
    

